// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/win/scoped_fullscreen_visibility.h"

#include "base/logging.h"

namespace views {

// static
std::map<HWND, int>* ScopedFullscreenVisibility::full_screen_windows_ = NULL;

ScopedFullscreenVisibility::ScopedFullscreenVisibility(HWND hwnd)
    : hwnd_(hwnd)
{
    if (!full_screen_windows_)
        full_screen_windows_ = new FullscreenHWNDs;
    FullscreenHWNDs::iterator it = full_screen_windows_->find(hwnd_);
    if (it != full_screen_windows_->end()) {
        it->second++;
    } else {
        full_screen_windows_->insert(std::make_pair(hwnd_, 1));
        // NOTE: Be careful not to activate any windows here (for example, calling
        // ShowWindow(SW_HIDE) will automatically activate another window).  This
        // code can be called while a window is being deactivated, and activating
        // another window will screw up the activation that is already in progress.
        SetWindowPos(hwnd_, NULL, 0, 0, 0, 0,
            SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
    }
}

ScopedFullscreenVisibility::~ScopedFullscreenVisibility()
{
    FullscreenHWNDs::iterator it = full_screen_windows_->find(hwnd_);
    DCHECK(it != full_screen_windows_->end());
    if (--it->second == 0) {
        full_screen_windows_->erase(it);
        ShowWindow(hwnd_, SW_SHOW);
    }
    if (full_screen_windows_->empty()) {
        delete full_screen_windows_;
        full_screen_windows_ = NULL;
    }
}

// static
bool ScopedFullscreenVisibility::IsHiddenForFullscreen(HWND hwnd)
{
    if (!full_screen_windows_)
        return false;
    return full_screen_windows_->find(hwnd) != full_screen_windows_->end();
}

} // namespace views
